
package com.jf.cloud.product.mapper;

import com.jf.cloud.common.order.bo.RefundReductionStockBO;
import com.jf.cloud.common.product.vo.SpuVO;
import com.jf.cloud.product.bo.SkuWithStockBO;
import com.jf.cloud.product.model.SpuExtension;
import com.jf.cloud.product.vo.SpuExtensionVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;


/**
 * @author zz
 * @date 2020-11-11 13:49:06
 */
public interface SpuExtensionMapper {

    /**
     * 获取列表
     *
     * @return 列表
     */
    List<SpuExtensionVO> list();

    /**
     * 根据id获取
     *
     * @param spuExtendId id
     * @return
     */
    SpuExtensionVO getBySpuExtendId(@Param("spuExtendId") Long spuExtendId);

    /**
     * 保存
     *
     * @param spuExtension
     */
    void save(@Param("spuExtension") SpuExtension spuExtension);


    /**
     * 批量复制相关商品信息保存
     * @param spuDbList 商品信息
     */
    void batchCopyOldSpuExtension(@Param("spuDbList") List<SpuVO> spuDbList);

    /**
     * 批量添加库存
     * @param spuExtensionList 批量添加库存
     */
    void batchUpdateSpuStocks(@Param("spuExtensionList") List<SpuExtension> spuExtensionList);

    /**
     * 根据id删除
     *
     * @param spuId id
     */
    void deleteById(@Param("spuId") Long spuId);

    /**
     * 更新库存
     *
     * @param spuId 商品id
     */
    int updateStock(@Param("spuId") Long spuId);

    /**
     * 通过订单减少库存
     *
     * @param spuId 商品id
     * @param count 数量
     * @return
     */
    int reduceStockByOrder(@Param("spuId") Long spuId, @Param("count") Integer count);

    /**
     * 通过订单添加库存
     *
     * @param skuWithStock 库存信息
     */
    void addStockByOrder(@Param("skuWithStock") SkuWithStockBO skuWithStock);

    /**
     * 通过订单减少实际库存
     *
     * @param skuWithStock 库存信息
     */
    void reduceActualStockByOrder(@Param("skuWithStock") SkuWithStockBO skuWithStock);

    /**
     * 通过订单增加销量（分片后只需要增加销量）
     * @param skuWithStocks
     */
    void addSaleNumByOrder(@Param("skuWithStocks") List<SkuWithStockBO> skuWithStocks);

    /**
     * 通过订单,增加商家代销销量
     *
     * @param skuWithStocks 库存信息
     */
    void addShopSoldNumByOrder(@Param("skuWithStocks") List<SkuWithStockBO> skuWithStocks);

    /**
     * 通过已经取消的订单减少实际库存
     *
     * @param skuWithStock 库存信息
     */
    void reduceActualStockByCancelOrder(@Param("skuWithStock") SkuWithStockBO skuWithStock);

    /**
     * 获取spu扩展信息
     *
     * @param spuId
     * @return
     */
    SpuExtension getBySpuId(Long spuId);

    /**
     * 还原商品实际库存，减少销量
     *
     * @param skuWithStock
     */
    void reductionActualStockByRefund(@Param("skuWithStock") RefundReductionStockBO skuWithStock);

    /**
     * 通过退款减少销量
     * @param skuWithStock
     */
    void subSaleNumByRefund(@Param("skuWithStock") RefundReductionStockBO skuWithStock);

    /**
     * 更新商品扩展信息
     *
     * @param spuExtension
     */
    void update(@Param("spuExtension") SpuExtension spuExtension);

    /**
     * 根据商品id更新商品注水销量
     * @param spuId
     * @param waterSoldNum
     */
    void updateWaterSoldNumBySpuId(@Param("spuId") Long spuId, @Param("waterSoldNum") Integer waterSoldNum);

    /**
     * 根据商品id修改商品评价数量
     * @param spuId
     * @param changeCount
     */
    void changeCommentNum(@Param("spuId") Long spuId, @Param("changeCount") Integer changeCount);

    /**
     * 根据秒杀订单支付成功，更新商品销量
     * @param spuId
     * @param prodCount
     * @return
     */
    void updateSaleNumBySeckillOrder(@Param("spuId")Long spuId, @Param("prodCount")Integer prodCount);

    /**
     * 供应商发货的代销商品退款成功后，减少代销商品对应的销量
     * @param commissionSpuRefundReductionStocks
     */
    void reduceCommissionSpuSaleNum(@Param("commissionSpuRefundReductionStocks") List<RefundReductionStockBO> commissionSpuRefundReductionStocks);

    /**
     * 更新spu为未分片的状态
     * @param spuId
     * @param stock
     * @param actualStock 实际库存
     * @param lockStock
     */
    void updateSpuToUndoZone(@Param("spuId") Long spuId, @Param("stock") Integer stock, @Param("actualStock") Integer actualStock, @Param("lockStock") Integer lockStock);

    /**
     * 获取该商品剩余的sku分片数
     * @param spuId
     * @param skuId 除开这个sku
     * @return 返回为0的话证明这个商品已经没有其他sku被分片了
     */
    Integer getRemainingZoneSkuCount(@Param("spuId") Long spuId, @Param("skuId") Long skuId);
}
